﻿using System.Collections.Generic;
using System.Linq;
using User.EF.Contracts;
using User.EF.Model;
using User.Global.Constvalues;
using User.Global.Resources;
using User.Web.Contracts.Model.Admin;

namespace User.Web.Models.Admin
{
    /// <summary>
    /// Memberliste über alle verfügbaren Member im System.
    /// Wird als Anzeigemodel für die API verwendet.
    /// </summary>
    public class MemberListApiModel : ModelBase, IMemberListApiModel 
    {
        #region Member
        /// <summary>
        /// Die aktuelle Mitarbeiterliste, hier werden nur die letzten 50 Member zurückgegeben
        /// </summary>
        public virtual List<IMemberModel> MemberList { get; set; }

        /// <summary>
        /// Die maximale Anzahl an Benutzern in der DB
        /// </summary>
        public int MaxMemberCount { get; set; }

        /// <summary>
        /// Anzahl der Gefundenen Benutzer über den eingegebenen Filter.
        /// </summary>
        public int FilterMemberCount { get; set; }
        #endregion

        #region Initialize
        public MemberListApiModel()
        {
            MemberList = new List<IMemberModel>();
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Filtern unserer Memberliste mit Hilfe der Filtermodeldaten.
        /// </summary>
        /// <param name="webQuery">Unsere WebQueries</param>
        /// <param name="filterModel">das passende Filtermodel, mit den Daten nach denen gefiltert werden soll</param>
        public virtual void FilterMemberList(IWebQuerySummary webQuery, IMemberListFilterModel filterModel)
        {
            if (filterModel != null)
            {
                //Nach den passenden Daten filtern, dabei werden auch mehrere Worte auseinander genommen und entsprechend nach jedem einzelenen Wort gesucht.
                IQueryable<Member> members = webQuery.MemberQueries.GetMembers(ConstLengthValues.MaxTakeItemEntries, filterModel.FilterString);

                var mem = (members.Select(p => new MemberModel()
                {
                    Firstname = p.MemberExtension != null ? p.MemberExtension.Firstname : string.Empty,
                    Lastname = p.MemberExtension != null ? p.MemberExtension.Lastname : string.Empty,
                    HasProvider = p.MemberOAuth != null ? DefaultMessages.Yes : DefaultMessages.No,
                    LastLoginDate = p.LastLoginTry,
                    Loginname = p.Username,
                    Id = p.Id,
                    IsActiveAccount = p.IsActive ? DefaultMessages.Yes : DefaultMessages.No
                }).ToList());

                MemberList.AddRange(mem);
                FilterMemberCount = MemberList.Count;
                MaxMemberCount = webQuery.MemberQueries.MemberCount();
            }
        }
        #endregion
    }
}
